藉著在 Ant 哥這一篇下的回覆(
https://www.facebook.com/1815507975/posts/10215890666418971/?d=n),剛好能帶出一個重點,其實CI 跟 CD 從來都不該是指 "build server",而是狀態。
持續整合 (Continuous Integration) 指的是:當團隊不只一個人對同一份 code base 在進行修改時,能多快地被整合在一起,並確認執行結果符合需求預期。
持續交付 (Continuous Delivery) 指的則更偏向:對 code base 的任何修改,在整合完確認無誤之後,可以不間斷、自動、快速地交付到 production 給使用者用。(包含 hotfix 修問題,包含 feature flag 的 rollback)而不是得等待 release 的日期才能 release,而不是得等一堆環境上的手動測試完,再自行打包對應的 feature code base 上到 production.
那種 DevOps = CI/CD = build server 的,要嘛就是被迫得用這樣的說明其他人才聽得懂,要嘛就是根本不懂 DevOps 跟 CI/CD 背後真正的涵義,以及那種狀態下的軟體開發交付,以及真正想要解決的問題。(自動化只是其中的一小個必要條件)
看大家說的 CI, 可以簡單把持續整合當作有狹義跟廣義兩種。
狹義就是只到拉 code 跟 build 跟打包。
廣義就是包含整合 build 完的 package 「是不是符合預期」,要知道使用起來有沒有符合預期,自動化測試是基本的。包含最基底針對邏輯的單元測試,還有部署到測試環境之後 end-to-end 的驗收測試。
有趣的是,大部分人在講 CI 都是廣義的,該有的都要有(我們以前 build job 還包含要自動產生符合公司規定或政府規定的 上版文件並自動發送通知),基本款就是拉 code, build, 靜態程式碼分析, 自動單元測試, 打包, 部署到下個環境, 執行該環境的 end-to-end 測試,產生文件。
但大部分嘴巴講廣義 CI 的人,他們實際的 CI 卻是狹義的 CI,只有拉 code + build, 勉強多一點靜態程式碼分析的套件,但也只是分析而已,也不會依據報告結果去修正或重構。